package verfahren;

import controll.SchedulingSimulatorController;

public class ShortestJobFirst extends SchedulingVerfahren {

	Thread t;
	double wartezeit = 0;
	int tmp = 1;
	
	public ShortestJobFirst(int anzahlThreads, int[] cpuLaufZeit ,SchedulingSimulatorController controller) {
		super(anzahlThreads, cpuLaufZeit, controller);
	}

	@Override
	public void verwalteThreads() {

		sort();
		for(MyThread th : threads) {
			th.t.start();
			while(th.t.isAlive()) {
				// warte bis Threads fertig ist
			}

			/*
			 * Zeiche ein neues Rechteck und aktualisiere GUI
			 */
			if(th.getlaufZeit() != 0) {
				controller.getView().addRect(th.getID(), th.getGelaufeneZeit(), th.getGewarteteZeit(), th.getColor());
				controller.getView().reDraw();
			}
			
			summe += th.getlaufZeit();
			
			laufzeit += summe;
			if(tmp != threads.length) wartezeit +=summe;
			tmp ++;
		}
		laufzeit = laufzeit/threads.length;
		wartezeit = wartezeit/threads.length;
	}

	@Override
	public void erzeugeThreads() {

		for (int i1 = 0; i1 < threads.length; i1++) {
			threads[i1] = new MyThread(i1+1,cpuLaufZeit[i1],randomColor());
		}
	} 

	/**
	 * Sortiert die Threads nach ihrer Laufzeit aufsteigend
	 */
	public void sort(){
		MyThread temp;
		boolean unsortiert = true;

		while (unsortiert){
			unsortiert = false;
			for (int i=0; i < threads.length-1; i++) 
				if (threads[i].getlaufZeit() > threads[i+1].getlaufZeit()) {                      
					temp       = threads[i];
					threads[i]       = threads[i+1];
					threads[i+1] = temp;
					unsortiert = true;
				}
		}
	}

	@Override
	public double berechneLaufZeit() {
		return laufzeit;
	}

	@Override
	public double berechneWartezeit() {
		return wartezeit;
	}
}
